import {def} from './utils'
import defineReactive from "./defineReactive";
import {arrayMethods} from './arr'
import {observe} from "./observe";
import Dep from "./Dep";
export default class Observer{
  constructor(value) {
    // 每个实例都有dep
    this.dep = new Dep()
    // 这里的this是实例
    def(value,'__ob__',this,false)
    // 将正常的所有属性变为每个属性都可以被检测
    if (Array.isArray(value)){
      // 如果是数组那么把原型链的指向修改到当前封装的内容
      Object.setPrototypeOf(value,arrayMethods)
      this.observeArray(value)
    } else {
      this.walk(value)
    }
  }
  // 遍历value属性
  walk(value) {
    for(let item in value) {
      defineReactive(value,item)
    }
  }
  // 数组的特殊遍历
  observeArray(arr){
    for (const arrKey in arr) {
      observe(arr[arrKey])
    }
  }
}